📝 MySQL 闯关练习 · 参考答案

共 10 关 · 满分 100 分 · 教师用

第1关 创建一张简单的学生表 写 SQL · 10分
创建学生信息表 student,包含 sno(CHAR(10) NOT NULL)、sname(VARCHAR(30))、age(INT)。
✅ 参考答案
CREATE TABLE student ( sno CHAR(10) NOT NULL, sname VARCHAR(30), age INT );
评分要点:必须包含 CREATE TABLE studentsno CHAR(10) NOT NULLsname VARCHAR(30)age INT。字段顺序不要求,大小写不敏感。
第2关 选择合适的数据类型 选择题 · 10分
要存储商品价格(如 99.50 元),需要精确到分,应该用哪个数据类型?
✅ 正确答案
BDECIMAL(10,2)
DECIMAL 是精确数值类型,不会出现浮点误差,算钱必须用它。FLOAT 是近似值,会出现 0.1+0.2≠0.3 的问题。INT 没有小数,VARCHAR 是字符串,都不合适。
第3关 补全 NOT NULL 约束 填空题 · 10分
创建员工表 employee,要求 ename 不能为空。在横线处填入正确的关键字。
✅ 正确答案
CREATE TABLE employee ( eid INT, ename VARCHAR(50) NOT NULL, salary DECIMAL(10,2) );
NOT NULL 约束表示该字段不允许为空值,插入数据时必须提供值。
第4关 PRIMARY KEY 的特点 选择题 · 10分
关于主键(PRIMARY KEY),以下哪个说法是正确的?
✅ 正确答案
CPRIMARY KEY = NOT NULL + UNIQUE
主键 = 不能为空 + 不能重复。
❌ A:一张表只能有一个主键。
❌ B:主键绝对不允许 NULL
❌ D:主键可以用于任何类型(CHAR、VARCHAR、INT 等),不限于 INT。
第5关 创建带主键的课程表 写 SQL · 10分
创建课程表 course,cno 为主键,cname 不能为空。
✅ 参考答案
CREATE TABLE course ( cno CHAR(10) NOT NULL PRIMARY KEY, cname VARCHAR(50) NOT NULL, credit INT );
评分要点:必须有 PRIMARY KEY 修饰 cno。写成列约束(如上)或表约束 PRIMARY KEY (cno) 均可。cname 必须有 NOT NULL
第6关 添加 UNIQUE 约束 填空题 · 10分
用户表 users 中,邮箱 email 不能重复。填入正确的约束关键字。
✅ 正确答案
CREATE TABLE users ( uid INT PRIMARY KEY, email VARCHAR(100) UNIQUE, name VARCHAR(50) );
UNIQUE 约束保证该列的值在整张表中不重复。与 PRIMARY KEY 的区别:一张表可以有多个 UNIQUE,且 UNIQUE 允许 NULL。
第7关 外键的作用 选择题 · 10分
在 sc 中插入一个学生表里不存在的学号,会发生什么?
✅ 正确答案
B插入失败,外键约束拒绝
外键的核心作用是保证引用完整性——从表中引用的值必须在主表中真实存在,否则数据库会直接拒绝插入操作。
第8关 创建带外键的选课表 写 SQL · 10分
创建选课表 sc,sno+cno 联合主键,分别引用 s 表和 c 表的外键。
✅ 参考答案
CREATE TABLE sc ( sno CHAR(10) NOT NULL, cno CHAR(10) NOT NULL, score DECIMAL(5,2), PRIMARY KEY (sno, cno), FOREIGN KEY (sno) REFERENCES s(sno), FOREIGN KEY (cno) REFERENCES c(cno) );
评分要点:
① 必须有 PRIMARY KEY (sno, cno) 联合主键。
② 必须有两条 FOREIGN KEY ... REFERENCES 语句。
③ sno、cno 的类型必须与被引用表的主键类型一致(CHAR(10))。
第9关 用 CHECK 限制取值范围 填空题 · 10分
成绩 score 只允许 0~100 之间的值,补全 CHECK 约束。
✅ 正确答案
CREATE TABLE exam ( sid CHAR(10) NOT NULL, score DECIMAL(5,2) CHECK(score>=0 AND score<=100), PRIMARY KEY (sid) );
CHECK(条件) 约束限制字段的取值范围。也可以写成 CHECK(score BETWEEN 0 AND 100),效果相同。空格和 = 的位置可灵活调整。
第10关·终极 综合判断:找出所有正确的说法 多选题 · 10分
以下关于 MySQL 建表和约束的说法,哪些是正确的?
✅ 正确选项(共3个)
A. UNIQUE 列允许有多个 NULL 值 C. FOREIGN KEY 引用的必须是主表的主键或 UNIQUE 字段 E. VARCHAR 比 CHAR 更节省空间(长度不固定时)
逐项分析:

A:MySQL 中 NULL ≠ NULL,所以 UNIQUE 列可以有多个 NULL,不算重复。
B:一张表只能有一个 PRIMARY KEY(但可以是联合主键)。
C:外键引用的目标必须是主表的主键或 UNIQUE 列,否则无法建立引用。
D:CHECK 不仅可以用于数字,也可以用于字符串等类型,如 CHECK(sex IN ('男','女'))
E:VARCHAR 按实际内容长度存储,对于长度不固定的数据比 CHAR 省空间。
F:AUTO_INCREMENT 只能用于整数类型(如 INT、BIGINT),不能用于 VARCHAR。